﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using CarCrash.Application.Drawing.entities.Forms;

namespace CarCrash.Application.Drawing.entities
{
    public class TS : DrawableEntity
    {
        //параметры на будщее для смены цвета машинки
        private Color color;
        private int thickness;
        public Color Color
        {
            get { return color; }
            set { color = value; pen = new Pen(color, thickness); }
        }
        public int Thickness
        {
            get { return thickness; }
            set { thickness = value; pen = new Pen(color, thickness); }
        }
        private Pen pen;

        //длина, ширина и кол-во осей нашего ТС - основные параметры для отрисовки
        private int lenght;
        private int width;
        private int noa;
        //диаметр и ширина колеса...в будущем будут из бд, пока что по умолчанию
        private int diam;
        private int shir;

        public TS()
        {
            //по умолчанию будут черные тонкие линии
            Color = Color.Gray;
            Thickness = 2;
            pen = new Pen(Color, Thickness);
            diam = 4;
            shir = 2;
        }

        //сюда попадают введенные в форме параметры
        //на форме данные в метрах, здесь в пикселах, поэтому примем 1 м = 10 пикс.
        public double Lenght { get { return lenght; } set { lenght = Convert.ToInt32(value * 10); } }
        public double Width { get { return width; } set { width = Convert.ToInt32(value * 10); } }
        public int NumberOfAxles { get { return noa; } set { noa = value; } }

        public override void Paint(Graphics g)
        {
            Pen wheelpen = new Pen(Color.Black, 2);
            //в зависимости от кол-ва осей выбирается способ отрисовки
            //позже увеличится кол-во параметров отрисовки, соответственно увеличим кол-во способов

            //корпус
            g.DrawRectangle(pen, new Rectangle(CorrectBeginX, CorrectBeginY, lenght, width));

            switch (noa)
            {
                case 3:
                    //выделим осевые пары
                    g.DrawRectangle(new Pen(Color.Gray, 1), new Rectangle(CorrectBeginX + Convert.ToInt32(lenght / 12), CorrectBeginY, diam, width));
                    g.DrawRectangle(new Pen(Color.Gray, 1), new Rectangle(CorrectBeginX + Convert.ToInt32(5 * lenght / 12), CorrectBeginY, diam, width));
                    g.DrawRectangle(new Pen(Color.Gray, 1), new Rectangle(CorrectBeginX + Convert.ToInt32(5 * lenght / 12), CorrectBeginY, diam, width));
                    //колеса
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(lenght / 12), CorrectBeginY - Convert.ToInt32(shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(5 * lenght / 12), CorrectBeginY - Convert.ToInt32(shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(9 * lenght / 12), CorrectBeginY - Convert.ToInt32(shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(lenght / 12), CorrectBeginY + width - Convert.ToInt32(9 * shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(5 * lenght / 12), CorrectBeginY + width - Convert.ToInt32(9 * shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(9 * lenght / 12), CorrectBeginY - + width - Convert.ToInt32(9 * shir / 10), diam, shir));
                    break;
                default:
                    //выделим переднюю и заднюю осевые пары
                    g.DrawRectangle(new Pen(Color.Gray, 1), new Rectangle(CorrectBeginX + Convert.ToInt32(lenght / 8), CorrectBeginY, diam, width));
                    g.DrawRectangle(new Pen(Color.Gray, 1), new Rectangle(CorrectBeginX + Convert.ToInt32(6 * lenght / 8), CorrectBeginY, diam, width));
                    //колеса
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(lenght / 8), CorrectBeginY - Convert.ToInt32(shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(6 * lenght / 8), CorrectBeginY - Convert.ToInt32(shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(lenght / 8), CorrectBeginY + width - Convert.ToInt32(9 * shir / 10), diam, shir));
                    g.DrawRectangle(wheelpen, new Rectangle(CorrectBeginX + Convert.ToInt32(6 * lenght / 8), CorrectBeginY + width - Convert.ToInt32(9 * shir / 10), diam, shir));
                    break;
            }
            //проведем вектор направления от центра автомобиля
            g.DrawLine(new Pen(Color.DarkRed, 2),
                       new Point(CorrectBeginX + Convert.ToInt32(lenght / 2), CorrectBeginY + Convert.ToInt32(width / 2)),
                       new Point(CorrectBeginX + Convert.ToInt32(lenght) - 10, CorrectBeginY + Convert.ToInt32(width / 2)));
            //треугольник-указатель
            Point[] trian = { new Point(CorrectBeginX + Convert.ToInt32(lenght), CorrectBeginY+Convert.ToInt32(width/2)),
                                      new Point(CorrectBeginX + Convert.ToInt32(lenght) - 10,CorrectBeginY+Convert.ToInt32(width/2)-4),
                                      new Point(CorrectBeginX + Convert.ToInt32(lenght) - 10,CorrectBeginY+Convert.ToInt32(width/2)+4) 
                                    };
            g.DrawPolygon(new Pen(Color.DarkRed, 2), trian);

            //переопределим правую нижнюю точку, чтобы рамка выделения была точно по фигуре
            EndX = CorrectBeginX + Convert.ToInt32(lenght);
            EndY = CorrectBeginY + Convert.ToInt32(width);
        }

        public override System.Windows.Forms.Form GetForm()
        {
            return new TSForm(this);
        }
    }
}
